﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace NJT.Services
{

    public class 正则式
    {
        public List<string> 取得全部匹配结果(string 源, string 正则式)
        {
            var r = new Regex(正则式, RegexOptions.IgnoreCase); // 定义一个Regex对象实例
            var mc = r.Matches(源); // 在字符串中匹配
            var 结果 = new List<string>();
            for (var i = 0; i < mc.Count; i++) //在输入字符串中找到所有匹配
            {
                结果.Add(mc[i].Value.Trim()); //将匹配的字符串添在字符串数组中
            }
            return 结果;
        }

        //取得单个匹配结果.
        public string 取得单个匹配(string 源, string 正则式)
        {
            var 结果 = "";
            var r = new Regex(正则式, RegexOptions.IgnoreCase); // 定义一个Regex对象实例
            var m = r.Match(源); // 在字符串中匹配
            if (m.Success)
            {
                结果 = m.Value;
            }
            return 结果;
        }

        //匹配双字节字符(包括汉字在内)：[^\x00-\xff] 
        //应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1） 


        //匹配空行的正则表达式：\n[\s| ]*\r 

        //匹配HTML标记的正则表达式：/<(.*)>.*<\/\1>|<(.*) \/>/ 

        //匹配首尾空格的正则表达式：(^\s*)|(\s*$) 

        //应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下： 

        //String.prototype.trim = function() 
        //{ 
        //    return this.replace(/(^\s*)|(\s*$)/g, ""); 
        //} 

        //利用正则表达式分解和转换IP地址： 

        //下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序： 

        //function IP2V(ip) 
        //{ 
        //re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式 
        //if(re.test(ip)) 
        //{ 
        //return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 
        //} 
        //else 
        //{ 
        //throw new Error("Not a valid IP address!") 
        //} 
        //} 

        //不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下： 

        //var ip="10.100.20.168" 
        //ip=ip.split(".") 
        //alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1)) 

        //匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 

        //匹配网址URL的正则表达式：http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 

        //利用正则表达式去除字串中重复的字符的算法程序：[注：此程序不正确，原因见本贴回复] 

        //var s="abacabefgeeii" 
        //var s1=s.replace(/(.).*\1/g,"$1") 
        //var re=new RegExp("["+s1+"]","g") 
        //var s2=s.replace(re,"") 
        //alert(s1+s2) //结果为：abcefgi 

        //补充： 
        //^\d+$　　//匹配非负整数（正整数 + 0） 
        //^[0-9]*[1-9][0-9]*$　　//匹配正整数 
        //^((-\d+)|(0+))$　　//匹配非正整数（负整数 + 0） 
        //^-[0-9]*[1-9][0-9]*$　　//匹配负整数 
        //^-?\d+$　　　　//匹配整数 
        //^\d+(\.\d+)?$　　//匹配非负浮点数（正浮点数 + 0） 
        //^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$　　//匹配正浮点数 
        //^((-\d+(\.\d+)?)|(0+(\.0+)?))$　　//匹配非正浮点数（负浮点数 + 0） 
        //^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$　　//匹配负浮点数 
        //^(-?\d+)(\.\d+)?$　　//匹配浮点数 
        //^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串 
        //^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串 
        //^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串 
        //^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串 
        //^\w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串 
        //^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$　　　　//匹配email地址 
        //^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$　　//匹配url 


        //利用正则表达式去除字串中重复的字符的算法程序： 

        //var s="abacabefgeeii" 
        //var s1=s.replace(/(.).*\1/g,"$1") 
        //var re=new RegExp("["+s1+"]","g") 
        //var s2=s.replace(re,"") 
        //alert(s1+s2) //结果为：abcefgi 
        //=============================== 
        //如果var s = "abacabefggeeii" 
        //结果就不对了，结果为：abeicfgg 
        //正则表达式的能力有限 

        //RE: totoro 
        //谢谢你的指点，这个javascript正则表达式程序算法确实有问题，我会试着找更好的办法!!! 

        //1.确认有效电子邮件格式 
        //下面的代码示例使用静态 Regex.IsMatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址，则 IsValidEmail 方法返回 true，否则返回 false，但不采取其他任何操作。您可以使用 IsValidEmail，在应用程序将地址存储在数据库中或显示在 ASP.NET 页中之前，筛选出包含无效字符的电子邮件地址。 

        //[Visual Basic] 
        //Function IsValidEmail(strIn As String) As Boolean 
        //' Return true if strIn is in valid e-mail format. 
        //Return Regex.IsMatch(strIn, ("^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$") 
        //End Function 
        //[C#] 
        //bool IsValidEmail(string strIn) 
        //{ 
        //// Return true if strIn is in valid e-mail format. 
        //return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"); 
        //} 


        //2.清理输入字符串 
        //下面的代码示例使用静态 Regex.Replace 方法从字符串中抽出无效字符。您可以使用这里定义的 CleanInput 方法，清除掉在接受用户输入的窗体的文本字段中输入的可能有害的字符。CleanInput 在清除掉除 @、-（连字符）和 .（句点）以外的所有非字母数字字符后返回一个字符串。 

        //[Visual Basic] 
        //Function CleanInput(strIn As String) As String 
        //' Replace invalid characters with empty strings. 
        //Return Regex.Replace(strIn, "[^\w\.@-]", "") 
        //End Function 
        //[C#] 
        //String CleanInput(string strIn) 
        //{ 
        //// Replace invalid characters with empty strings. 
        //return Regex.Replace(strIn, @"[^\w\.@-]", ""); 
        //} 


        //3.更改日期格式 
        //以下代码示例使用 Regex.Replace 方法来用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。 

        //[Visual Basic] 
        //Function MDYToDMY(input As String) As String 
        //Return Regex.Replace(input, _ 
        //"\b(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{2,4})\b", _ 
        //"${day}-${month}-${year}") 
        //End Function 
        //[C#] 
        //String MDYToDMY(String input) 
        //{ 
        //return Regex.Replace(input, 
        //"\\b(?<month>\\d{1,2})/(?<day>\\d{1,2})/(?<year>\\d{2,4})\\b", 
        //"${day}-${month}-${year}"); 
        //} 


        //匹配中文字符的正则表达式： [\u4e00-\u9fa5] 

        //匹配双字节字符(包括汉字在内)：[^\x00-\xff] 


        //匹配空行的正则表达式：\n[\s| ]*\r 
    }

}
